/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-11-14 13:45:10
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-11-21 21:37:09
 * @FilePath: /linux33/LockGuard.hpp
//  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <pthread.h>

class LockGuard
{
public:
    LockGuard(pthread_mutex_t *mutex):_mutex(mutex)
    {
        pthread_mutex_lock(_mutex);
    }
    ~LockGuard()
    {
        pthread_mutex_unlock(_mutex);
    }
private:
    pthread_mutex_t *_mutex;
};

// 这段代码定义了一个名为 LockGuard 的 C++ 类，其目的是为多线程环境中的互斥锁（pthread_mutex_t）提供一种自动管理锁的机制。LockGuard 是一种 RAII（Resource Acquisition Is Initialization） 风格的锁管理类，用于简化锁的获取和释放。我们来逐步分析这段代码的实现。
// 构造函数：当 LockGuard 对象被创建时，它会接受一个指向互斥锁的指针 mutex，并将其存储在 _mutex 成员变量中。
// pthread_mutex_lock(_mutex)：此语句通过 pthread_mutex_lock 函数请求对传入的互斥锁的独占访问权限。若锁已经被其他线程持有，当前线程将会被阻塞，直到锁变为可用。
// 这样，在 LockGuard 对象被创建时，它会立即获取互斥锁，确保对共享资源的访问在 LockGuard 对象的生命周期内是安全的。
// 析构函数：当 LockGuard 对象超出作用域（即生命周期结束时），析构函数会被自动调用。
// pthread_mutex_unlock(_mutex)：在析构函数中，调用 pthread_mutex_unlock 来释放锁。这样，互斥锁在 LockGuard 对象销毁时被自动解锁，避免了手动解锁的遗漏，保证了线程安全。


// RAII 特性
// LockGuard 类的核心是 RAII（资源获取即初始化）模式。通过这种模式，在对象创建时自动获取锁，在对象销毁时自动释放锁，避免了程序员忘记解锁的情况。
// RAII 确保了即使发生异常，锁也能被正确释放，因为栈上的局部对象（如 LockGuard）会在离开作用域时自动销毁，从而触发析构函数并释放资源。